{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3c5859c2",
   "metadata": {},
   "source": [
    "本小节我们将使用 RNN 完成图像说明( Image Captioning)任务。该任务需要联合 CNN 与 RNN 一同学习，CNN 用于提取图像特征，RNN 用于生成图像特征所对应的说明文字。   \n",
    "\n",
    "在训练阶段，首先我们将图片放入卷积网络中进行特征提取，将其作为隐藏层h0的输入；然后将图片对应的文字描述一个单词接一个单词的输入到 RNN 中，而 RNN 输出则是当前单词的下一个预测单词。\n",
    "\n",
    "在测试阶段，我们将 RNN 预测的当前单词，作为下一时间片段的输入数据输入到 RNN 中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "46ef9953",
   "metadata": {},
   "outputs": [],
   "source": [
    "#-*- coding: utf-8 -*-\n",
    "import time, os, json\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from classifiers.chapter7 import *\n",
    "from utils import *\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] =(10.0, 8.0) \n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "    \"\"\"相对误差\"\"\"\n",
    "    return np.max(np.abs(x - y) /(np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83a679f7",
   "metadata": {},
   "source": [
    "### Microsoft COCO\n",
    "\n",
    "本练习将使用2014年发布的 [Microsoft COCO dataset](http://mscoco.org/)，其作为标准的图像说明测试数据，包含有80000个训练数据以及40000验证数据，使用该网址\"http://cs231n.stanford.edu/coco_captioning.zip\" 下载数据集，下载完毕后解压到datasets文件目录。\n",
    "\n",
    "该套数据集已经对数据使用VGG-16卷积网络进行了特征提取，分别存放在`train2014_vgg16_fc7.h5`和`val2014_vgg16_fc7.h5`\n",
    "\n",
    "如果想要缩短运行时间，其也将特征从4096降到了512维，分别存放在`train2014_vgg16_fc7_pca.h5`以及`val2014_vgg16_fc7_pca.h5`中\n",
    "\n",
    "原始图像大约有20GB，你可以使用`train2014_urls.txt`和`val2014_urls.txt`访问(需要翻墙)。\n",
    "\n",
    "直接处理字符串非常不高效，因此我们给每个词分配了字典ID方便我们查阅使用。因此，输入的序列数据其实是一条字典ID串，该文件存放在 `coco2014_vocab.json`。你需要使用`coco_utils.py`文件中的 `decode_captions`函数将ID转换为词向量。\n",
    "\n",
    "在训练RNN前，你需要使用记号 `<START>` 和 `<END>`标记句子的开头与结束。对于一些不常用的词我们使用`<UNK>` 进行替换。为了使句子长度相同，对于短句子，我们在 `<END>`标记后，填充`<NULL>` ，在训练时，不计算`<NULL>` 的损失与梯度。\n",
    "\n",
    "以上内容可能过于繁杂，我们已经默默处理好了，你知道即可。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b1555fc9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_captions <class 'numpy.ndarray'> (400135, 17) int32\n",
      "train_image_idxs <class 'numpy.ndarray'> (400135,) int32\n",
      "val_captions <class 'numpy.ndarray'> (195954, 17) int32\n",
      "val_image_idxs <class 'numpy.ndarray'> (195954,) int32\n",
      "train_features <class 'numpy.ndarray'> (82783, 512) float32\n",
      "val_features <class 'numpy.ndarray'> (40504, 512) float32\n",
      "idx_to_word <class 'list'> 1004\n",
      "word_to_idx <class 'dict'> 1004\n",
      "train_urls <class 'numpy.ndarray'> (82783,) <U63\n",
      "val_urls <class 'numpy.ndarray'> (40504,) <U63\n"
     ]
    }
   ],
   "source": [
    "data = load_coco_data(pca_features=True)\n",
    "for k, v in data.items():\n",
    "    if type(v) == np.ndarray:\n",
    "        print(k, type(v), v.shape, v.dtype)\n",
    "    else:\n",
    "        print(k, type(v), len(v))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a869da9",
   "metadata": {},
   "source": [
    "### RNN单步前向传播\n",
    "\n",
    "打开 `classifiers\\chapter7\\rnn_layers.py`文件。完成`rnn_step_forward`函数，实现RNN的单步前向传播。\n",
    "\n",
    "完成后运行下列代码，检验你的实现。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d141d00a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "next_h 误差:  6.292421426471037e-09\n"
     ]
    }
   ],
   "source": [
    "N, D, H = 3, 10, 4\n",
    "\n",
    "x = np.linspace(-0.4, 0.7, num=N*D).reshape(N, D)\n",
    "prev_h = np.linspace(-0.2, 0.5, num=N*H).reshape(N, H)\n",
    "Wx = np.linspace(-0.1, 0.9, num=D*H).reshape(D, H)\n",
    "Wh = np.linspace(-0.3, 0.7, num=H*H).reshape(H, H)\n",
    "b = np.linspace(-0.2, 0.4, num=H)\n",
    "\n",
    "next_h, _ = rnn_step_forward(x, prev_h, Wx, Wh, b)\n",
    "expected_next_h = np.asarray([\n",
    "    [-0.58172089, -0.50182032, -0.41232771, -0.31410098],\n",
    "    [ 0.66854692,    0.79562378,    0.87755553,    0.92795967],\n",
    "    [ 0.97934501,    0.99144213,    0.99646691,    0.99854353]])\n",
    "\n",
    "print('next_h 误差: ', rel_error(expected_next_h, next_h))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60ad8a0c",
   "metadata": {},
   "source": [
    "### RNN单步反向传播\n",
    "\n",
    "打开 classifiers\\chapter7\\rnn_layers.py文件。完成`rnn_step_backward`函数，实现RNN的单步反向传播。\n",
    "\n",
    "完成后运行下列代码，检验你的实现。你的相对误差应该小于`1e-8`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c26cf3e7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx 误差:  1.310256557537144e-09\n",
      "dprev_h 误差:  2.1172970274127977e-10\n",
      "dWx 误差:  1.6514816613293213e-08\n",
      "dWh 误差:  1.770717277127576e-09\n",
      "db 误差:  3.152117259170483e-10\n"
     ]
    }
   ],
   "source": [
    "N, D, H = 4, 5, 6\n",
    "x = np.random.randn(N, D)\n",
    "h = np.random.randn(N, H)\n",
    "Wx = np.random.randn(D, H)\n",
    "Wh = np.random.randn(H, H)\n",
    "b = np.random.randn(H)\n",
    "\n",
    "out, cache = rnn_step_forward(x, h, Wx, Wh, b)\n",
    "\n",
    "dnext_h = np.random.randn(*out.shape)\n",
    "\n",
    "# 计算前向传播后的各个值\n",
    "fx = lambda x: rnn_step_forward(x, h, Wx, Wh, b)[0]\n",
    "fh = lambda prev_h: rnn_step_forward(x, h, Wx, Wh, b)[0]\n",
    "fWx = lambda Wx: rnn_step_forward(x, h, Wx, Wh, b)[0]\n",
    "fWh = lambda Wh: rnn_step_forward(x, h, Wx, Wh, b)[0]\n",
    "fb = lambda b: rnn_step_forward(x, h, Wx, Wh, b)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dnext_h)\n",
    "dprev_h_num = eval_numerical_gradient_array(fh, h, dnext_h)\n",
    "dWx_num = eval_numerical_gradient_array(fWx, Wx, dnext_h)\n",
    "dWh_num = eval_numerical_gradient_array(fWh, Wh, dnext_h)\n",
    "db_num = eval_numerical_gradient_array(fb, b, dnext_h)\n",
    "\n",
    "dx, dprev_h, dWx, dWh, db = rnn_step_backward(dnext_h, cache)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx_num, dx))\n",
    "print('dprev_h 误差: ', rel_error(dprev_h_num, dprev_h))\n",
    "print('dWx 误差: ', rel_error(dWx_num, dWx))\n",
    "print('dWh 误差: ', rel_error(dWh_num, dWh))\n",
    "print('db 误差: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "581f052e",
   "metadata": {},
   "source": [
    "### RNN时序前向传播\n",
    "\n",
    "现在你需要将单步RNN组合起来，实现完整的时序RNN前向传播过程\n",
    "\n",
    "打开    `classifiers\\chapter7\\rnn_layers.py` ,完成 `rnn_forward`函数编码。你的相对误差应该要小于`1e-7`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2af42335",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "h 误差:  7.728466180186066e-08\n"
     ]
    }
   ],
   "source": [
    "N, T, D, H = 2, 3, 4, 5\n",
    "\n",
    "x = np.linspace(-0.1, 0.3, num=N*T*D).reshape(N, T, D)\n",
    "h0 = np.linspace(-0.3, 0.1, num=N*H).reshape(N, H)\n",
    "Wx = np.linspace(-0.2, 0.4, num=D*H).reshape(D, H)\n",
    "Wh = np.linspace(-0.4, 0.1, num=H*H).reshape(H, H)\n",
    "b = np.linspace(-0.7, 0.1, num=H)\n",
    "\n",
    "h, _ = rnn_forward(x, h0, Wx, Wh, b)\n",
    "expected_h = np.asarray([\n",
    "    [\n",
    "        [-0.42070749, -0.27279261, -0.11074945,    0.05740409,    0.22236251],\n",
    "        [-0.39525808, -0.22554661, -0.0409454,     0.14649412,    0.32397316],\n",
    "        [-0.42305111, -0.24223728, -0.04287027,    0.15997045,    0.35014525],\n",
    "    ],\n",
    "    [\n",
    "        [-0.55857474, -0.39065825, -0.19198182,    0.02378408,    0.23735671],\n",
    "        [-0.27150199, -0.07088804,    0.13562939,    0.33099728,    0.50158768],\n",
    "        [-0.51014825, -0.30524429, -0.06755202,    0.17806392,    0.40333043]]])\n",
    "print('h 误差: ', rel_error(expected_h, h))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f172cd1c",
   "metadata": {},
   "source": [
    "### RNN时序反向传播\n",
    "现在你需要将单步RNN反向传播组合起来，实现完整的时序RNN反向传播过程\n",
    "\n",
    "打开 `classifiers\\chapter7\\rnn_layers.py`    ,完成 `rnn_backward` 函数编码。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "88af8920",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx 误差:  3.019690437635004e-09\n",
      "dh0 误差:  2.1293713568630968e-10\n",
      "dWx 误差:  1.227642349941746e-09\n",
      "dWh 误差:  1.8455612502078363e-09\n",
      "db 误差:  1.347211901044371e-10\n"
     ]
    }
   ],
   "source": [
    "N, D, T, H = 2, 3, 10, 5\n",
    "\n",
    "x = np.random.randn(N, T, D)\n",
    "h0 = np.random.randn(N, H)\n",
    "Wx = np.random.randn(D, H)\n",
    "Wh = np.random.randn(H, H)\n",
    "b = np.random.randn(H)\n",
    "\n",
    "out, cache = rnn_forward(x, h0, Wx, Wh, b)\n",
    "\n",
    "dout = np.random.randn(*out.shape)\n",
    "\n",
    "dx, dh0, dWx, dWh, db = rnn_backward(dout, cache)\n",
    "\n",
    "fx = lambda x: rnn_forward(x, h0, Wx, Wh, b)[0]\n",
    "fh0 = lambda h0: rnn_forward(x, h0, Wx, Wh, b)[0]\n",
    "fWx = lambda Wx: rnn_forward(x, h0, Wx, Wh, b)[0]\n",
    "fWh = lambda Wh: rnn_forward(x, h0, Wx, Wh, b)[0]\n",
    "fb = lambda b: rnn_forward(x, h0, Wx, Wh, b)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "dh0_num = eval_numerical_gradient_array(fh0, h0, dout)\n",
    "dWx_num = eval_numerical_gradient_array(fWx, Wx, dout)\n",
    "dWh_num = eval_numerical_gradient_array(fWh, Wh, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, b, dout)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx_num, dx))\n",
    "print('dh0 误差: ', rel_error(dh0_num, dh0))\n",
    "print('dWx 误差: ', rel_error(dWx_num, dWx))\n",
    "print('dWh 误差: ', rel_error(dWh_num, dWh))\n",
    "print('db 误差: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b6704286",
   "metadata": {},
   "source": [
    "### 词嵌入前向传播\n",
    "\n",
    "现在，需要将时序数据（索引串）转换为词向量。\n",
    "\n",
    "打开 `classifiers\\chapter7\\rnn_layers.py`文件，实现 `word_embedding_forward`函数，将单词索引，转化为词向量。\n",
    "\n",
    "运行下列代码，你的实现误差大约在范围`1e-8`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4a8b5550",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "out 误差:  1.0000000094736443e-08\n"
     ]
    }
   ],
   "source": [
    "N, T, V, D = 2, 4, 5, 3\n",
    "\n",
    "x = np.asarray([[0, 3, 1, 2], [2, 1, 0, 3]])\n",
    "W = np.linspace(0, 1, num=V*D).reshape(V, D)\n",
    "\n",
    "out, _ = word_embedding_forward(x, W)\n",
    "expected_out = np.asarray([\n",
    " [[ 0.,                    0.07142857,    0.14285714],\n",
    "    [ 0.64285714,    0.71428571,    0.78571429],\n",
    "    [ 0.21428571,    0.28571429,    0.35714286],\n",
    "    [ 0.42857143,    0.5,                 0.57142857]],\n",
    " [[ 0.42857143,    0.5,                 0.57142857],\n",
    "    [ 0.21428571,    0.28571429,    0.35714286],\n",
    "    [ 0.,                    0.07142857,    0.14285714],\n",
    "    [ 0.64285714,    0.71428571,    0.78571429]]])\n",
    "\n",
    "print('out 误差: ', rel_error(expected_out, out))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae44f8a4",
   "metadata": {},
   "source": [
    "### 词嵌入反向传播\n",
    "实现 `word_embedding_backward`函数，完成词嵌入的反向传播。\n",
    "\n",
    "运行下列梯度检验代码，你的误差应该小于`1e-11`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2d98c949",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dW 误差:  3.2759708946363888e-12\n"
     ]
    }
   ],
   "source": [
    "N, T, V, D = 50, 3, 5, 6\n",
    "\n",
    "x = np.random.randint(V, size=(N, T))\n",
    "W = np.random.randn(V, D)\n",
    "\n",
    "out, cache = word_embedding_forward(x, W)\n",
    "dout = np.random.randn(*out.shape)\n",
    "dW = word_embedding_backward(dout, cache)\n",
    "\n",
    "f = lambda W: word_embedding_forward(x, W)[0]\n",
    "dW_num = eval_numerical_gradient_array(f, W, dout)\n",
    "\n",
    "print('dW 误差: ', rel_error(dW, dW_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84c5461d",
   "metadata": {},
   "source": [
    "### 时序输出仿射层\n",
    "\n",
    "RNN隐藏层到输出层传播和前馈网络类似，只是其数据为(N,T,D)的三维数据。\n",
    "\n",
    "我们已经将其前向传播，反向传播分别实现在了`temporal_affine_forward`和 `temporal_affine_backward`函数中。\n",
    "\n",
    "打开`rnn_layers.py`文件，阅读相关代码，并运行下列代码进行检验"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4458d96f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx 误差:  1.1680190237299396e-09\n",
      "dw 误差:  1.195903277097059e-11\n",
      "db 误差:  1.0561424698310812e-11\n"
     ]
    }
   ],
   "source": [
    "N, T, D, M = 2, 3, 4, 5\n",
    "x = np.random.randn(N, T, D)\n",
    "w = np.random.randn(D, M)\n",
    "b = np.random.randn(M)\n",
    "\n",
    "out, cache = temporal_affine_forward(x, w, b)\n",
    "\n",
    "dout = np.random.randn(*out.shape)\n",
    "\n",
    "fx = lambda x: temporal_affine_forward(x, w, b)[0]\n",
    "fw = lambda w: temporal_affine_forward(x, w, b)[0]\n",
    "fb = lambda b: temporal_affine_forward(x, w, b)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "dw_num = eval_numerical_gradient_array(fw, w, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, b, dout)\n",
    "\n",
    "dx, dw, db = temporal_affine_backward(dout, cache)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx_num, dx))\n",
    "print('dw 误差: ', rel_error(dw_num, dw))\n",
    "print('db 误差: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "342db3ce",
   "metadata": {},
   "source": [
    "### 时序Softmax损失函数\n",
    "\n",
    "在使用RNN进行语言建模时，每一时间步我们都会预测下一个单词对应单词字典中的单词得分索引。每一时间片段我们使用softmax作为损失函数，而整个序列的损失值，我们是将每一时间片段的损失值加起来取平均值。但句子的长度是不相同的，为了使输入对齐，我们填充`<NULL>`补全短句子。但这些填充的 `<NULL>`标记不应该计算在损失值或梯度值内，我们需要使用 `mask`进行过滤。我们已经将其写进`rnn_layers.py`文件中的 `temporal_softmax_loss` 函数，阅读即可。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "dce5b8f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.302582382261073\n",
      "23.02576008490865\n",
      "2.34310410100737\n",
      "dx 误差:  5.811536038658937e-08\n"
     ]
    }
   ],
   "source": [
    "N, T, V = 100, 1, 10\n",
    "\n",
    "def check_loss(N, T, V, p):\n",
    "    x = 0.001 * np.random.randn(N, T, V)\n",
    "    y = np.random.randint(V, size=(N, T))\n",
    "    mask = np.random.rand(N, T) <= p\n",
    "    print(temporal_softmax_loss(x, y, mask)[0])\n",
    "    \n",
    "check_loss(100, 1, 10, 1.0)     # 损失值大约为 2.3\n",
    "check_loss(100, 10, 10, 1.0)    # 损失值大约为 23\n",
    "check_loss(5000, 10, 10, 0.1) # 损失值大约为 2.3\n",
    "\n",
    "N, T, V = 7, 8, 9\n",
    "\n",
    "x = np.random.randn(N, T, V)\n",
    "y = np.random.randint(V, size=(N, T))\n",
    "mask =(np.random.rand(N, T) > 0.5)\n",
    "\n",
    "loss, dx = temporal_softmax_loss(x, y, mask, verbose=False)\n",
    "\n",
    "dx_num = eval_numerical_gradient(\n",
    "        lambda x: temporal_softmax_loss(x, y, mask)[0], x, verbose=False)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d2d9fd8c",
   "metadata": {},
   "source": [
    "## RNN图像说明任务\n",
    "\n",
    "我们已经实现了我所需的各项零件，接下来我们就用RNN完成图片说明任务。打开`rnn.py`文件，阅读`CaptioningRNN`类。你需要实现RNN的`loss`函数，以及测试阶段使用的`sample`函数。目前你只需实现`cell_type = 'rnn'`即可，之后再实现LSTM部分内容。\n",
    "\n",
    "完成后运行下列代码，你的损失误差应该小于 `1e-10`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "07d8f79f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "损失:  9.832355910027388\n",
      "期望损失:  9.83235591003\n",
      "误差:  2.611244553918368e-12\n"
     ]
    }
   ],
   "source": [
    "N, D, W, H = 10, 20, 30, 40\n",
    "word_to_idx = {'<NULL>': 0, 'cat': 2, 'dog': 3}\n",
    "V = len(word_to_idx)\n",
    "T = 13\n",
    "\n",
    "model = CaptioningRNN(word_to_idx,\n",
    "                    input_dim=D,\n",
    "                    wordvec_dim=W,\n",
    "                    hidden_dim=H,\n",
    "                    cell_type='rnn')\n",
    "\n",
    "for k, v in model.params.items():\n",
    "    model.params[k] = np.linspace(-1.4, 1.3, num=v.size).reshape(*v.shape)\n",
    "\n",
    "features = np.linspace(-1.5, 0.3, num=(N * D)).reshape(N, D)\n",
    "captions =(np.arange(N * T) % V).reshape(N, T)\n",
    "\n",
    "loss, grads = model.loss(features, captions)\n",
    "expected_loss = 9.83235591003\n",
    "\n",
    "print('损失: ', loss)\n",
    "print('期望损失: ', expected_loss)\n",
    "print('误差: ', abs(loss - expected_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b12f65a0",
   "metadata": {},
   "source": [
    " `CaptioningRNN` 梯度检验，期望误差在 `1e-7` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "05f02acb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W_embed 相对误差: 4.599221e-09\n",
      "W_proj 相对误差: 5.548484e-09\n",
      "W_vocab 相对误差: 3.479308e-08\n",
      "Wh 相对误差: 1.954925e-08\n",
      "Wx 相对误差: 8.715990e-06\n",
      "b 相对误差: 2.182615e-09\n",
      "b_proj 相对误差: 4.525645e-09\n",
      "b_vocab 相对误差: 1.879290e-09\n"
     ]
    }
   ],
   "source": [
    "batch_size = 2\n",
    "timesteps = 3\n",
    "input_dim = 4\n",
    "wordvec_dim = 5\n",
    "hidden_dim = 6\n",
    "word_to_idx = {'<NULL>': 0, 'cat': 2, 'dog': 3}\n",
    "vocab_size = len(word_to_idx)\n",
    "\n",
    "captions = np.random.randint(vocab_size, size=(batch_size,\n",
    "                                                                                             timesteps))\n",
    "features = np.random.randn(batch_size, input_dim)\n",
    "\n",
    "model = CaptioningRNN(word_to_idx,\n",
    "                    input_dim=input_dim,\n",
    "                    wordvec_dim=wordvec_dim,\n",
    "                    hidden_dim=hidden_dim,\n",
    "                    cell_type='rnn'\n",
    "                )\n",
    "\n",
    "loss, grads = model.loss(features, captions)\n",
    "\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(features, captions)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], \n",
    "                         verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s 相对误差: %e' %(param_name, e))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3882f71",
   "metadata": {},
   "source": [
    "### 过拟合小量数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "82f765ad",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 100) loss: 87.278615\n",
      "(Iteration 11 / 100) loss: 24.241030\n",
      "(Iteration 21 / 100) loss: 6.001595\n",
      "(Iteration 31 / 100) loss: 1.049757\n",
      "(Iteration 41 / 100) loss: 0.638685\n",
      "(Iteration 51 / 100) loss: 0.245997\n",
      "(Iteration 61 / 100) loss: 0.199264\n",
      "(Iteration 71 / 100) loss: 0.145133\n",
      "(Iteration 81 / 100) loss: 0.130924\n",
      "(Iteration 91 / 100) loss: 0.118513\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "small_data = load_coco_data(max_train=50)\n",
    "\n",
    "small_rnn_model = CaptioningRNN(\n",
    "                    cell_type='rnn',\n",
    "                    word_to_idx=data['word_to_idx'],\n",
    "                    input_dim=data['train_features'].shape[1],\n",
    "                    hidden_dim=512,\n",
    "                    wordvec_dim=256,\n",
    "                )\n",
    "\n",
    "small_rnn_solver = CaptioningTrainer(small_rnn_model, small_data,\n",
    "                     update_rule='adam',\n",
    "                     num_epochs=50,\n",
    "                     batch_size=25,\n",
    "                     updater_config={\n",
    "                         'learning_rate': 5e-3,\n",
    "                     },\n",
    "                     lr_decay=0.95,\n",
    "                     verbose=True, print_every=10,\n",
    "                 )\n",
    "\n",
    "small_rnn_solver.train()\n",
    "\n",
    "# Plot the training losses\n",
    "plt.plot(small_rnn_solver.loss_history)\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training loss history')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e34dde0e",
   "metadata": {},
   "source": [
    "## LSTM\n",
    "\n",
    "### LSTM单步前向传播\n",
    "\n",
    "打开 `rnn_layers.py`文件，完成lstm_step_forward代码，实现LSTM的单步前向传播。\n",
    "\n",
    "运行下列代码，你的实现误差应该在` 1e-8`以内。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "392979cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "next_h 误差:  5.7054131185818695e-09\n",
      "next_c 误差:  5.8143123088804145e-09\n"
     ]
    }
   ],
   "source": [
    "N, D, H = 3, 4, 5\n",
    "x = np.linspace(-0.4, 1.2, num=N*D).reshape(N, D)\n",
    "prev_h = np.linspace(-0.3, 0.7, num=N*H).reshape(N, H)\n",
    "prev_c = np.linspace(-0.4, 0.9, num=N*H).reshape(N, H)\n",
    "Wx = np.linspace(-2.1, 1.3, num=4*D*H).reshape(D, 4 * H)\n",
    "Wh = np.linspace(-0.7, 2.2, num=4*H*H).reshape(H, 4 * H)\n",
    "b = np.linspace(0.3, 0.7, num=4*H)\n",
    "\n",
    "next_h, next_c, cache = lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)\n",
    "\n",
    "expected_next_h = np.asarray([\n",
    "        [ 0.24635157,    0.28610883,    0.32240467,    0.35525807,    0.38474904],\n",
    "        [ 0.49223563,    0.55611431,    0.61507696,    0.66844003,    0.7159181 ],\n",
    "        [ 0.56735664,    0.66310127,    0.74419266,    0.80889665,    0.858299    ]])\n",
    "expected_next_c = np.asarray([\n",
    "        [ 0.32986176,    0.39145139,    0.451556,        0.51014116,    0.56717407],\n",
    "        [ 0.66382255,    0.76674007,    0.87195994,    0.97902709,    1.08751345],\n",
    "        [ 0.74192008,    0.90592151,    1.07717006,    1.25120233,    1.42395676]])\n",
    "\n",
    "print('next_h 误差: ', rel_error(expected_next_h, next_h))\n",
    "print('next_c 误差: ', rel_error(expected_next_c, next_c))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e60bc19",
   "metadata": {},
   "source": [
    "### LSTM:单步反向传播\n",
    "\n",
    "打开 rnn_layers.py文件，完成lstm_step_backward函数代码，实现LSTM的单步反向传播。\n",
    "\n",
    "运行下列代码，你的期望误差应该在1e-8以内"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "fa9aceb4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx 误差:  2.36114504649104e-10\n",
      "dh 误差:  5.784107694134561e-10\n",
      "dc 误差:  6.99069012739093e-10\n",
      "dWx 误差:  6.291017711941009e-08\n",
      "dWh 误差:  4.4809579254128135e-09\n",
      "db 误差:  2.551473660645273e-10\n"
     ]
    }
   ],
   "source": [
    "N, D, H = 4, 5, 6\n",
    "x = np.random.randn(N, D)\n",
    "prev_h = np.random.randn(N, H)\n",
    "prev_c = np.random.randn(N, H)\n",
    "Wx = np.random.randn(D, 4 * H)\n",
    "Wh = np.random.randn(H, 4 * H)\n",
    "b = np.random.randn(4 * H)\n",
    "\n",
    "next_h, next_c, cache = lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)\n",
    "\n",
    "dnext_h = np.random.randn(*next_h.shape)\n",
    "dnext_c = np.random.randn(*next_c.shape)\n",
    "\n",
    "fx_h = lambda x: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "fh_h = lambda h: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "fc_h = lambda c: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "fWx_h = lambda Wx: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "fWh_h = lambda Wh: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "fb_h = lambda b: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[0]\n",
    "\n",
    "fx_c = lambda x: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "fh_c = lambda h: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "fc_c = lambda c: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "fWx_c = lambda Wx: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "fWh_c = lambda Wh: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "fb_c = lambda b: lstm_step_forward(x, prev_h, prev_c, Wx, Wh, b)[1]\n",
    "\n",
    "num_grad = eval_numerical_gradient_array\n",
    "\n",
    "dx_num = num_grad(fx_h, x, dnext_h) + num_grad(fx_c, x, dnext_c)\n",
    "dh_num = num_grad(fh_h, prev_h, dnext_h) + num_grad(fh_c, prev_h, dnext_c)\n",
    "dc_num = num_grad(fc_h, prev_c, dnext_h) + num_grad(fc_c, prev_c, dnext_c)\n",
    "dWx_num = num_grad(fWx_h, Wx, dnext_h) + num_grad(fWx_c, Wx, dnext_c)\n",
    "dWh_num = num_grad(fWh_h, Wh, dnext_h) + num_grad(fWh_c, Wh, dnext_c)\n",
    "db_num = num_grad(fb_h, b, dnext_h) + num_grad(fb_c, b, dnext_c)\n",
    "\n",
    "dx, dh, dc, dWx, dWh, db = lstm_step_backward(dnext_h, dnext_c, cache)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx_num, dx))\n",
    "print('dh 误差: ', rel_error(dh_num, dh))\n",
    "print('dc 误差: ', rel_error(dc_num, dc))\n",
    "print('dWx 误差: ', rel_error(dWx_num, dWx))\n",
    "print('dWh 误差: ', rel_error(dWh_num, dWh))\n",
    "print('db 误差: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de0fe633",
   "metadata": {},
   "source": [
    "### LSTM前向传播\n",
    "\n",
    "现在将单步传播组合起来，完成完整的时序传播。打开`rnn_layers.py` 文件，完成`lstm_forward`函数代码，实现LSTM的前向传播。\n",
    "\n",
    "运行下列代码，你的实现误差应该在1e-7以内"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "160ac5e2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "h 误差:  8.610537452106624e-08\n"
     ]
    }
   ],
   "source": [
    "N, D, H, T = 2, 5, 4, 3\n",
    "x = np.linspace(-0.4, 0.6, num=N*T*D).reshape(N, T, D)\n",
    "h0 = np.linspace(-0.4, 0.8, num=N*H).reshape(N, H)\n",
    "Wx = np.linspace(-0.2, 0.9, num=4*D*H).reshape(D, 4 * H)\n",
    "Wh = np.linspace(-0.3, 0.6, num=4*H*H).reshape(H, 4 * H)\n",
    "b = np.linspace(0.2, 0.7, num=4*H)\n",
    "\n",
    "h, cache = lstm_forward(x, h0, Wx, Wh, b)\n",
    "\n",
    "expected_h = np.asarray([\n",
    " [[ 0.01764008,    0.01823233,    0.01882671,    0.0194232 ],\n",
    "    [ 0.11287491,    0.12146228,    0.13018446,    0.13902939],\n",
    "    [ 0.31358768,    0.33338627,    0.35304453,    0.37250975]],\n",
    " [[ 0.45767879,    0.4761092,     0.4936887,     0.51041945],\n",
    "    [ 0.6704845,     0.69350089,    0.71486014,    0.7346449 ],\n",
    "    [ 0.81733511,    0.83677871,    0.85403753,    0.86935314]]])\n",
    "\n",
    "print('h 误差: ', rel_error(expected_h, h))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5105a16",
   "metadata": {},
   "source": [
    "### LSTM反向传播\n",
    "\n",
    "现在将单步反向传播组合起来，完成完整的时序反向传播。打开`rnn_layers.py` 文件，完成`lstm_backward` 函数代码，实现LSTM的反向传播。\n",
    "\n",
    "运行下列代码。你的误差大约在`1e-8` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "33c81e07",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx 误差:  7.278901660157261e-10\n",
      "dh0 误差:  7.278901660157261e-10\n",
      "dWx 误差:  7.278901660157261e-10\n",
      "dWh 误差:  7.278901660157261e-10\n",
      "db 误差:  7.278901660157261e-10\n"
     ]
    }
   ],
   "source": [
    "\n",
    "N, D, T, H = 2, 3, 10, 6\n",
    "\n",
    "x = np.random.randn(N, T, D)\n",
    "h0 = np.random.randn(N, H)\n",
    "Wx = np.random.randn(D, 4 * H)\n",
    "Wh = np.random.randn(H, 4 * H)\n",
    "b = np.random.randn(4 * H)\n",
    "\n",
    "out, cache = lstm_forward(x, h0, Wx, Wh, b)\n",
    "\n",
    "dout = np.random.randn(*out.shape)\n",
    "\n",
    "dx, dh0, dWx, dWh, db = lstm_backward(dout, cache)\n",
    "\n",
    "fx = lambda x: lstm_forward(x, h0, Wx, Wh, b)[0]\n",
    "fh0 = lambda h0: lstm_forward(x, h0, Wx, Wh, b)[0]\n",
    "fWx = lambda Wx: lstm_forward(x, h0, Wx, Wh, b)[0]\n",
    "fWh = lambda Wh: lstm_forward(x, h0, Wx, Wh, b)[0]\n",
    "fb = lambda b: lstm_forward(x, h0, Wx, Wh, b)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "dh0_num = eval_numerical_gradient_array(fh0, h0, dout)\n",
    "dWx_num = eval_numerical_gradient_array(fWx, Wx, dout)\n",
    "dWh_num = eval_numerical_gradient_array(fWh, Wh, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, b, dout)\n",
    "\n",
    "print('dx 误差: ', rel_error(dx_num, dx))\n",
    "print('dh0 误差: ', rel_error(dx_num, dx))\n",
    "print('dWx 误差: ', rel_error(dx_num, dx))\n",
    "print('dWh 误差: ', rel_error(dx_num, dx))\n",
    "print('db 误差: ', rel_error(dx_num, dx))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b49c0b59",
   "metadata": {},
   "source": [
    "### LSTM图片说明任务\n",
    "\n",
    "打开`rnn.py`文件，完成LSTM模式下的损失计算。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5421446c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "损失值:  9.82445935443226\n",
      "期望损失值:  9.82445935443\n",
      "误差:  2.261302256556519e-12\n"
     ]
    }
   ],
   "source": [
    "N, D, W, H = 10, 20, 30, 40\n",
    "word_to_idx = {'<NULL>': 0, 'cat': 2, 'dog': 3}\n",
    "V = len(word_to_idx)\n",
    "T = 13\n",
    "\n",
    "model = CaptioningRNN(word_to_idx,\n",
    "                    input_dim=D,\n",
    "                    wordvec_dim=W,\n",
    "                    hidden_dim=H,\n",
    "                    cell_type='lstm')\n",
    "\n",
    "for k, v in model.params.items():\n",
    "    model.params[k] = np.linspace(-1.4, 1.3, num=v.size).reshape(*v.shape)\n",
    "\n",
    "features = np.linspace(-0.5, 1.7, num=N*D).reshape(N, D)\n",
    "captions =(np.arange(N * T) % V).reshape(N, T)\n",
    "\n",
    "loss, grads = model.loss(features, captions)\n",
    "expected_loss = 9.82445935443\n",
    "\n",
    "print('损失值: ', loss)\n",
    "print('期望损失值: ', expected_loss)\n",
    "print('误差: ', abs(loss - expected_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a0d7875d",
   "metadata": {},
   "source": [
    "###    LSTM 过拟合测试\n",
    "\n",
    "和RNN类似，我们测试LSTM能否在小数据集上过拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "bcaefd07",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 100) loss: 77.184947\n",
      "(Iteration 11 / 100) loss: 39.224173\n",
      "(Iteration 21 / 100) loss: 26.396812\n",
      "(Iteration 31 / 100) loss: 14.473610\n",
      "(Iteration 41 / 100) loss: 4.766169\n",
      "(Iteration 51 / 100) loss: 1.583464\n",
      "(Iteration 61 / 100) loss: 1.577735\n",
      "(Iteration 71 / 100) loss: 0.271194\n",
      "(Iteration 81 / 100) loss: 0.206668\n",
      "(Iteration 91 / 100) loss: 0.110635\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "small_data = load_coco_data(max_train=50)\n",
    "\n",
    "small_lstm_model = CaptioningRNN(\n",
    "                    cell_type='lstm',\n",
    "                    word_to_idx=data['word_to_idx'],\n",
    "                    input_dim=data['train_features'].shape[1],\n",
    "                    hidden_dim=512,\n",
    "                    wordvec_dim=256)\n",
    "\n",
    "small_lstm_solver = CaptioningTrainer(small_lstm_model, small_data,\n",
    "                     update_rule='adam',\n",
    "                     num_epochs=50,\n",
    "                     batch_size=25,\n",
    "                     updater_config={\n",
    "                         'learning_rate': 5e-3,\n",
    "                     },\n",
    "                     lr_decay=0.995,\n",
    "                     verbose=True, print_every=10,\n",
    "                 )\n",
    "\n",
    "small_lstm_solver.train()\n",
    "\n",
    "plt.plot(small_lstm_solver.loss_history)\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training loss history')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "014f06c3",
   "metadata": {},
   "source": [
    "### LSTM test-time sampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1944d54d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm7.staticflickr.com/6178/6167892245_3ef7bfd6c2_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADlEXgAAEB5BB4AAFAegQcAAJRH4AEAAOUReAAAQHkEHgAAUB6BBwAAlEfgAQAA5RF4AABAeQQeAABQHoEHAACUR+ABAADl/X9BuF0FQYXyrwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm5.staticflickr.com/4121/4769212854_0bcba64aa7_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAEzv/wcMLwXhKx2i4wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm2.staticflickr.com/1112/596804848_afb6e350a8_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHvCAYAAABQTQWGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAnJUlEQVR4nO3de9xt13wv/s83RIJEUhKXBEHjruH4tUTrkip1qVtPlbqU0CpHHb1oURyCcFBKVdXlqLhUQqlLWw5aDU5RWsflaGipRCIJEbZEiOv4/THG06y99lrPfvZudDP2+/16rdez1pq3MS9rzs8ccz5zVGstAAAz22dPFwAA4PtN4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag/wA6OqjqmqM/Z0OYD5CDwAwPQEHgBgegIPcLGrqsdW1euXvvvDqnp+VT2oqk6pqvOr6t+q6qF7qpzA3kPgAb4fTkxy56q6XJJU1SWS3CvJa5J8McldklwuyYOSPLeqbrqnCgrsHQQe4GLXWjstyYeT3GN8ddskX2+tfaC19tettc+07t1J3pHkVnuoqMBeQuABvl9ek+Q+4/19x+dU1Z2q6gNV9eWq2pbkzkkO2TNFBPYWAg/w/fLnSY6pqqsm+fkkr6mq/ZK8Icmzk1yptXZwkrcmqT1WSmCvIPAA3xettXOSnJzk5Uk+21o7JcmlkuyX5Jwk36mqOyX52T1WSGCvIfAA30+vSXK78TettfOTPDLJ65J8Jf1S11v2WOmAvUa11vZ0GQAAvq/U8AAA0xN4AIDpCTwAwPQEHgBgegIPe52q+qmq+teq+lpV3eNiHO8xVXXGxTU+AC4+Ag9bUlW3rKr3VdVXxxNy/76qfqKqHjeCw9eq6sKq+u7C508sDH9yVX1lPHhucbwnVNW3Rv9frqp3VtX1qup+C+P5RlV9b+Hz1/6Ds/OUJC9orR3QWnvTf3BcXMzGtvKrS99tFyarqlXVx6tqn4Xvjq+qE8b7a4x+Ljk+V1X9UVV9sqoO/0+alf8UYz6P/D6Of4f1sZvj2VgnX1t63Xt0P2F0v9nCMEdWVVv4fPLYz5xfVedV1T+Nhmr3WzVNWCTwsFZVXWn8vVySv0ryR0kun+TwJE9O8s3W2tNHcDggycOSvH/jc2vthmP4a6S3ldSS3G3FpJ41hj88yeeTvKy19mcL471TkjMXxnvAYvl2wxFJPrGqwzgw+l1swWgQ9OIa1+6sy8OS/NIWxl1JXpzkmCS3aa19vqoOrKpL78Y0f+hshL49NO2qqkOXvj548bfcWnvtQrcvJzl+J6N9RGvtwCRXSfKo9G3grWM9p6ouX1X7XlzzwDzs2NlOVR1cVf+tqj6Y5ITx9XWSpLV2Ymvtu621b7TW3tFa+9gWR/uAJB8Y43vgup5aa99IfyDdTbY43hOq6oOjvAdvZYCq+kySayX5y3F2ud84a3xaVf19kq8nudaoZXrnqHX6VFXda2Ecd66qfx5nmZ+vqt9ZmsajquqLVXVWVT1ok7IcW1X/Nsbz2aq63/h+n6p6QlWdNsbzyqo6aHTbOEt+UFWdPmrNHla9tu1jVbWtql6wNJ0HV9Upo9+3V9URm5Tpz6vq7Oo1ee+pqhsudDuhqv6kqt5aVRck+emqOqyq3lBV54x5eORW1sMY375VdY+qenOST291uAXPSvLknRzQL5G+3f14kmNaa18Y398oyZlV9eKqOnoXyrxfVT2vqs4cr+dt1C7UqIXahfX/oLFezh/bwUM36ffIqnr3WC9fqqrXju/fM3r56Nie771QjsdU1dlJXj62qcdW1Weq6tyqel1VXX5h/EdXr8HdVlUfrapjxvdPSz9ZecEY/wuyBVV1rap6cpLPJnnwVoYZXpHkqKq6zc56bK1d0Fo7Of0k6hZJfm50un2SM6rqOVV1o12YNrNrrXnt5a/04Hv79KfhfjXJG9Nbud53dL9cknPTd0Z3SvIja8ZzbJL/s+L7Tyd5eJL/L8m309tQ2uh2QpLjx/vLJnlVko8uDX9MkjNWjHffUc43jnK/ZszHPjuZ31OT3G7h88lJPpfkhkkumeSgJKcnedD4fNMkX0pyw9H/WUluNd7/SJKbLpTzO+mXzPZNbxTz66uW15jX85Jcd3y+ysL4HzyW2bWSHJDkL5K8anS7RnpN2YuS7J/eLMOFSd6U5IrptWRfTK/JyFg+n05y/TEvT0jyvk2WzYOTHJje/MPzknxkaV19NclPjW3mMkn+KckT05uMuFaSf0tyh50s/x9L8gejnO9Prxk8eGl9/Opm28BYBtce0//V8d3xSU5YWk6vT/IPi+NfGMc1kzwpyWeSnJLk0UmuspOyPyU9vF8xyaFJ3pfkqbu6/kf/P5fkR9PbEbvN6Pema/o9Mcnjx3LfP8ktl5bFkUvL6jtJnjnW46WT/OYo91XHdy9OcuLo//D03/edc9G+4Nwkh65bH2vKeJn0k5u/G8P/SZKjF7pvrJNLrhn+hLEOH5mxH0lyZJK22bYxvn9PkmcufL5Rkt9PcmaSD6Xvf1auB6+957XHC+C1hzeA5BHpB/sPjx3NIWv6u/7YIZ0xdqZvyUJwGf0cm6XAk+SW6SHnkPH5k0l+a6H7CekH7G1Jvpd+RnjU0jiOyYrAs9TPIaP8Hx7z84hN+j01Owaepyx8vneS9y4N8+IkTxrvP5fkoUkut6Kc31jcoacf1I9eUYbLjnn+hSSXXur2t0kevvD5umMZXnLhoHH4Qvdzk9x74fMbkvzmeP+2JL+y0G2f9APrEVvYNg4e0zpoYV29cqH7zZN8bmmY30vy8jXju22Sf0wPk0/PCHsr+js5Wws8R6YfpD+XfhBfFXjOS/KoncxnJbl1kj9Nb+7ir5JcfU2/n0ly54XPd0hy6q6u/zXjflOS31jT7ZVJXpLkqiu6rQo830qy/8J3pyT5mYXPV1nYph6TEagXur89yQPXrY8VZfhf6Zej3prkXkn2W9HPxjrZtvS6/sL2dfxYl59LP7naauA5KclLV3x/ibGNvG5M66Qs/W699p6XS1pcM72W4iNJPpZ+8NxBa+2U1tqxrbWrpp89HZZeA7AzD0zyjtbal8bn12THy1rPbr3V7GukHzCuu0tz0J2bXv6PpM/PNXdx+NMX3h+R5Oajen9bVW1Lcr8kVx7dfyF9J3rauMxwi8VytNa+s/D56+m1NNtprV2QHqweluSsqvrrqrre6HxYktMWej8t/cC0eJ/LFxbef2PF541pHpHkDxfm48vpB/gdbtytqktU1TPGZY/z0oNh0sPkhuXldNjScnrcUjkXXTH9APb/knx0aR4XfSe9hmTRvukH6O201t6afnD8tTXjukuSJ1XV2ssqrbWWHgg+mh7ob5geSFdZtW4OW/i8pfWfJFV1p6r6QPXLptvSt6lDVvWbXvtUST5YVZ/YbH6Gc1prFy58PiLJGxfW0ylJvpu+ro5I8otL6/GW6aFoq26UHrI+kuRjrbVvbtLvIa21gxdepyx2HMM+dbxqi9M/PH3b3k5r7bu5aHv78iin+3v2UgLPXq619qj0SxEfT/L8JJ+tqqdW1bU3GeaT6Wdjm14fr35T6L2S3GbcF3J2kt9KcuOquvGK8X4uyW+kH6C3dENpVV27qp6aXjP0h2M+rjXma1e0hfenJ3n30k75gNbafxvl/FBr7e7pB/A3pZ897rLW2ttba7dPP7B8MslLR6cz0w9CG66eHgK+kF13epKHLs3LpVtr71vR732T3D29sc+D0gNosv1BZ3k5fXZp3Ae21u68qiCttZPSQ+Mrk/xK+j00L62qW1XV4jQ+tzDtDdfM+oD0hPTLPZdZ0e19Se6avk3dd7HDuB/nnlX1liT/mn7J9ZHp288pO44qyep1c+aaftca9/28Icmz02tKD06vHVl5gG+tnd1ae0hr7bD02sUX1ub/mdWWPp+e5E5L62r/1trnR7dXLXW7bGvtGWvGtap8Ryf56fRg/q7q99Y9oqqusLNh13h5+jb48zvrsaqulr7u3rvw3QHV75F7V3qt7+HptaA3aq2tPKljfgIPaa2d01p7bmvtqPTai4OTvL+q/jRJqt/A+6iquur4fLUk90m/J2Az90g/i7xB+o3IN0m/NPbe9Gv9q8ryzvQDyLoz9n83yvf+Ud5faK3deMzHOTsbdif+Ksl1quqXx421+1a/Kfj6VXWp6v8yf1Br7dvpl0y+u6sTqKorVdXdquqySb6Z5GsL4zkxyW9V1TWr6oD0yz+vXao52KoXJfm9GjcfV9VBVfWLa/o9cJTl3PTw8PSdjPuDSc4bN8deetQQ3aiqfmLdAK21C1u/+f1nk9w4vRbpZdn+puXXJnlQVd2suuukB+WT1ozz5PSgu1xzuNH93Un+a5KXVNU9k6Sqjkq/F+s3krw5ydVaaw9orf3dqPFZ58QkT6iqQ6vqkPT7l169Sf/rXCr90s05Sb5TVXdKvx9rpar6xY3fX/plt5aLtpcvpJ+0bOZFSZ5W44b1Uf67j26vTnLXqrrDWIf7V7/xeWN6Wxn/Ri3wo5NcLf2/OG+T5NSq+pWdDbtiXN9Jclz65baVquoy4+bmN6dvi28d398xfR9y7/RL0Ye31h7eWvvQrpaDyezpa2peP5iv9B3yzcb7w9NrMT6f5ILx98XZ8R6WY7NwD0+S/53kOSvGfa8kZ6efDZ6QcdPyQvd7j2nsNz4fk9U3Ld8syaV2Y95OzY738CzfM3LdJH+dfkA6N8m70gPbpcZ8fSU97Hwo4wbSVeVcntbC91dJ8u70m4C3jTLcYHTbJ/1AevqY/qszbrjMihs/0y/DHLPw+dVJnrDw+ZfTA8F5Y5x/uma5HJB+8Dg/vTblAVm4P2TNujosPQScPZbJB1bN7xbWyS2XPj84/dEB56WHocdm4Wb07Hjfys3Hdydsspx+Lj1Y3jW9punI3Sjn/uk1oWeN1/Mz7pXZlfU/uv16epjYln6z/knLy3eh32el/ya+ln4f0a8tdHvYKMu29N/WqnLsk+S3k3xqrN/PJHn60vJ7d/pln3PSt/2rj263SPIvY/0+fxeX1+Vz0Xa9sU6+tvT67VXb1yjz/8uO9/BcOObh/CT/N712b/F+pWsmOWxX163X/K9qbae1lQAAP9Rc0gIApifwAADTE3gAgOkJPADA9AQeplNVx1XV7vyr8EZ7UWsbL6yFlqmr6kVV9T92t5wXl/Ev7u+p3ibTc9b087iq+l9bGNfF0jL2D4qdzXdVnVpVt/vPLNMPmvoPtLa+2bCzbUv88BN41qiqX6qqf6iqC6o3BPgPVfXwqjqieiN6G682+tn4fKvdnN7dq+ojVXVe9cYB/7Z6Q5EvWhj3t6rq2wuf3zaGreqND/7zivGeXFUXjv6/VFV/UVVXGQeCjfFcWFXfXfi8siVxttdae1hr7al7uhzpzyz6UvpjAlY+cLH1Vu2nOPjsLJQummm+91Z1UYO5e6zV9101ttFvLR0rPjq6bczPXy8N8+qqOm68P6aqvrcw7BnVG3xd+4wrdk7gWaGqHpX+1N7fT39ex5XSn3XxU0nObv2puwe01jYeGX/jhe/eu3qsK6dzpfH3yPSnzz4q/emi10zywiTfGwfVjWltPIBuY1p3GqO6dfpTf6+15gfxiDH8kenPWnn2OBBsjPdhSd6/MN6Nh9StayKAHyxHJPnntuYZEz9MB4q9zap1Y33tuh+EZbZif/msxWNFa2356fJHV9VPbTLKM8f++cAkR6c/jf29VfUzm0yTTQg8S6rqoPTWjh/eWnt9a+381v3f1tr92uZtxGxl/Feuqt8dtTHHja9vkv6I/r8d0zq/tfaG1pta2IoHpj8w7q1Z87TZJGmtbUtvCuEmWxzv31XVu6rq/lW16rH9K1XVA6rqtKo6t6r+x+Jlg+Wz83Emc8Z4/7tV9Yalcf1RVT1vvD921GSdX1Wfrar7bVKMS1XVK0e/n6iqH18Y5/VHzde20e1um8zL71bVWVV1Zi21X7Q4LxvzUf2J1F8cwzxood8rVNVfjhq8D1XV8VX1fzaZ7p9Xb47jq9UvV91wTX8npK/zR48zwdtVv6T3+nHGeF6SY2vhMl/1J+m+eqyfbaM8izvOH63eNMBXq+rNVXX5hekdXVXvG8N9tKqOWeh2UFW9bMz758c8XmJNuferqueN5XrmeL/f6Hbs8rIZZ8RHVtWvpbdrtjG/fzm6P2ZM8/yq+tTGQaGWLm9Wf3r2xrb5+KVp7FNVj63elti51c+oL58VquqQqvqrsRy+XFXvrap9Fsu6uI5WbCePqd7UysvXrK/DquotY9yfrqqHrBrf4jgXPp9aVb9TVR8b6/C1VbX/QvfNtun9qurZVfW5qvpC9RrmS29l2DVWbkvV247770vT/lhV3WPFON4z/m4b6/wWYxv5+6p6blV9OclxWyj7XarXom8b2/BRC91Wbj87U/0p7Peoqjdn+6eFb8Wz0htL3dQ4JpzRWntieiOtz1zovFv76L2VwLOjW6Q/8v3NuzPw2Ak+dum7favqv46d86eSHJXeZs+vj14+nOR648f709WbE9jq9C6T5J5J/my8fqmqLrWm3yukP2J/qz/MH09vQfqBST5fVS+p7RvKXDWNG6TXTt0v/WnCB2VFQ5VrvDrJHavq4DGuS6Y/dflV1ZtgeH56e0AHJvnJ9IYK17lb+pNrD05v2f0FY5z7JvnLJO9IrxX770n+rKp2aLC0+iPqfyfJ7ZNcO72Nqc1cORfN768k+eOq+pHR7Y/Tn1J95fTluTaYDm8b07xi+vbxZ6t6aq0dO7ptnE3+zeh09ySvT5//5WEfOMp5tSRXSK/h+8ZC9wekP+n4sPQ2vJ6fJFV1ePoTeI9Pf4Lu7yR5Q1UdOoZ7xej/yCT/Jb2phHWXkx6fftZ6k/QmJm6W3ibWplprL1ma37uOdfeIJD8xto075KKGT//d2Db/JP3J04eNeb/qQi+PTG8O5Taj+1fS19sqj0p/wvWh6TXAj8sW2pwarpy+/I7IRU2oLK+vE8f4D0v/fT99qwfh4V5J7pheW3xU+lPQt7JNPzPJddLXy5Hp2/ITtzjsKiu3pfRt5f4bPVVvW+/wjOYhltx6/D14rPP3j883T/Jv6b+Rp+2k7DdN35c9NH29vzjJW0ZI2tL2s6iqfqyq/iD96dePSf+9Xm2nS2N7f5zehM2u3EP2F0luOvaHyW7so/dqe/pRzz9or/Qf4dlL370v/bHt30hy66Vu2z3ifsX4nprki+lnKQ9OcuCa/o5Ob77hnPRHp5+Q5IClfo5L8uoV5T0nvZmG/UY5f36h+8npLTZ/dZT1IxmPjF/o59gsNAmxpnxXS9+pfyq9avVea/p7YpITFz5fJr0V5duNzydk+8fHH5OFx+Cn7zgeMt7fJf1STdJbr96W3tbXpXdS1uOS/M3C5xsk+cZ4f6v0ZhAWmyk4Mclxy+VL35E8Y6G/62RNUwtjPr6R7Zsy+OJYr5dIb+n7ugvdjt/ZMl/o9+Ax3YPWdF9epsclec+6bSd9O3xfkqNWjOvkpXm+wVh/l0jfsb9qqf+3p+9sr5TeDtelF7rdJ8nfrSnzZ5LceeHzHZKcum57XLfcx+cjx7K+XZJ9N5nvJyY5aaHbZbP9tnlKkp9Z6H6Vsd4uuaL8T0k/Kdrht58dm71Y3k6+le2bQthufaX/1r6bhX1Fkv+Zi5rNWJ7/Y7L9b+jUJPdf+PysJC/a2Tad3nDpBUl+dKH7LdJrnzcdds063mxb2i+9GYtrj27PTvLCNeO5RnZsJuTYJJ9b+Lyzsv9JkqcujfdT6eF27fazoiy3TfKP6U20PD0Lv+kVv8kL0/dZG69XLM9Pkocn+cD4/tW5aD+03TpdGO/1xrCHr+i2pX303vxSw7Ojc5McUgvXhFtrP9l6a8bnZtdrxa6bZN/0oPGx1tr5q3pqrX2gtXav1tqh6QflW6efBe/MA5O8rrX2ndYvt/1Fdqw9eGRr7aD0M70fyfZntVt1VpKPjtfhm4zjsPSdQZKktfb19OW2VYtnfvdPb2MorbUL0mt7HpbkrFElfr1NxnP2wvuvJ9l/rNPDkpzeWvveQvfTsroWart5yfrWujec27Zv4PPr6fdMHZq+c1sc1+L77VRvwPEZ1S+tnJeLzjYP2cn0F60df/oyfXuSk8aliWeNmq9Vw56Wvv0ekl4j8YvjksC2qtqW5JbpweCI0d9ZC91enH72vcph2X55nja+22WttU8n+c304PDFqjqpqlaNa3nbvCDbb5tHJHnjQvlPSQ8eq+6T+P30mtJ3VL/M+tgV/axzTmvtwqXvFpf5YUm+vLSvWLeNrrO8/W/UGm+2TR+afoLyTwvL4H+P73c27Dort6Wxr3pdkvtXvxR4n4zf+i5YHPfOyn5EkkctbbtXS29za6vbT9K35yPT2/j6aDZfBs9u27dAv6pW96VJrlRVd9357Cbp20BLD1DLtrqP3msJPDt6f/qZ6t0vjpG11u6VXsX6pSSvrX7PyGPropaIVw3zofTgcqPNxj3Gcdv0ncbZ1e8JuGeSO1dvyXl5vB9Pr1n446qqrZS/qv5LVT03vXr98UnemX528QdrBjkrCz+0cQ39CgvdL0jfMW248tLwb0pyVFXdKL2G598vx7TW3t5au336AfaT6TuLXXVmkquNneyGq6dXTS87K9tXU199N6aXjBaxs/0OaLPq7/umb3+3S7/0dI3x/ZbW2bD28kpr7duttSe31m6QfmnwLtm+9frlef52+vZ7enoNz+JO/LKttWeMbt9MP5htdLtcGzfAr3Bm+kFocTpnjvfbbSNVtbyN7DBvrbXXtNZuOcbZsv19Dhu2W5/jcvDitnl6+iXTxfnbv7W2w7bR+n12j2qtXSu9MdLfXrjk9PVsvo2vWjeL352Z5PJVdeDCd4vb6M5+Q5vZbJv+Unot5Q0X5v+gdtE/Z+zO72HdtpT0k5v7JfmZJF9vF12qWrZuW178fmdlPz3J05bW7WVaaycmW95+0lo7KX15vzL9svWZVfXSqrrVVvepS+P7dnrL8k/N1n7fP5/kwyOsJ9mtffReS+BZ0vqNvU9O8sKqumdVHVD9ZsabpFeB7844T2utPSX9zODh6bU+n6iL/gXxllX1kKq64vh8vfR7UD6wk1H/cnorxtdND1U3Sa9mPiP9jGmVV6Sfpay9UXdDVb0r/X6XC9Mv5f1ka+2lrbXzNhns9UnuWlU/Oe4lenK2/yF/JD2QXX4cyH5zceBx5vv6JK9J8sE2btyu/qyZu41r199Mb2X5uzubhxX+If2A8ehxb9Ux6Qesk1b0+7r0G0hvMA6OT9qN6aW19t30AHtcVV1mrN8HbDLIgenzeG76ge3puzPddcZ9Yj9W/Ybi89IPQovL8v4L8/yUJK8f8/Dq9HV7h1ELtX/1G2av2lo7K/2+qOdU1eXGb+ZHq+o2a4pxYpInVNWhI5w/cYw/6WeoN6yqm1S/2fa4pWG/kORaC/Nz3aq6bfWbni9MP/Ct2jZen+Qu4/d2qTFvi/vAFyV5WlUdMcZ7aFWtPPGpfgPskeMgd96Y3sY0P5LkvmMZ3TH9ssmWtdZOT7/k+D/HMj4q/eC6Ef4/kk1+QzuxdpsetZ4vTfLchX3R4VV1h50Nu4l121JGwPlekudk89qdc0Z/11rXwxbK/tIkD6uqm1d32ar6uao6cBe2n41pXdhaO7G19rPp95+dmuRl2fWblje8Kv0S3x1XdRzlPbyqnpR+T9zjFrrtzj56ryXwrNBae1aS307y6PRru19Ir55/TPqOaK2qeltVPW5Vt9a9u7X2oPTq4TeNTtvSA8jHq+pr6VWxb0y/9r6ZB6Zf9z578ZW+415VfZrW2rfSbxzcygPzHp9+v8/vtdb+ZQv9p7X2ifQbgU9KPyM8P30Zbvx326vSD2inph8gX7tiNK9I8mPZfie4T/qNomemX/u/TXp43CVj/u+W5E7pZ4UvTPKA1tonV/T7tiTPS/Ku9J3Zu3Z1egsekV5bc3b6fJ2Yi5bJslemV5V/Psk/Z+fBd1ddOf3gf176ZZt356KwkVG+E0ZZ90+/mXfjQHz39B3uOelnzb+bi/YjD0hyqVHmr4xpXGVNGY5PvxfiY0k+nn5j9vFjOv+SfnD8myT/mmT5v9leluQG49LEm9IPFs9IX59npwf6HX6DY9v89fQwfdYo4xkLvfxh+g3u76iq89OX+83XlP/ao3xfS68VfmFr7eTR7TfSQ/S29BqMN60Zx2buk16zd2b6vuBJrbV3jm5b+Q2ttIVt+jHj+w9Uv5z6N+knVLv7e1i5LS14Zfpvfe2DQsdl8acl+fuxzo9e0+tmZf/HJA9J/+eFr4z+jh3DbWn7WVO201trT2utXSc77nM3/pNw4/WlNeP4bnp4XP6PwMPG8eBrST6UvpyOaa29Y6GfXd5H782qtbU13/AfVv0/zral35z42S0Oc/X0S1ZXnvVMpaqemT5/K4Mp7A2q6gFJfm1cToLvKzU8XOyq6q7j0s1l0//74uPZyb95Lgy7T3rt2kkzhZ2qul5VHTWqp2+WfonijXu6XLCnjMtcD0/ykj1dFvYOAg/fD3dPr4o/M73q/5faFqoSR0A6L/05H7t1v8wPsAPT7+O5IP1eiOdkN5/1BD/sxr0156TfLvCaPVwc9hIuaQEA01PDAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDpCTwAwPQEHgBgegIPADA9gQcAmJ7AAwBMT+ABAKYn8AAA0xN4AIDp/f/pU9olJnVNKQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm1.staticflickr.com/164/439147986_2486920a79_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATO//Am2k08TluJz3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "for split in ['train', 'val']:\n",
    "    minibatch = sample_coco_minibatch(small_data, split=split, batch_size=2)\n",
    "    gt_captions, features, urls = minibatch\n",
    "    gt_captions = decode_captions(gt_captions, data['idx_to_word'])\n",
    "\n",
    "    sample_captions = small_lstm_model.sample(features)\n",
    "    sample_captions = decode_captions(sample_captions, data['idx_to_word'])\n",
    "\n",
    "    for gt_caption, sample_caption, url in zip(gt_captions, sample_captions, urls):\n",
    "        # plt.imshow(image_from_url(url))\n",
    "        print(url)\n",
    "        plt.title('%s\\n%s\\nGT:%s' %(split, sample_caption, gt_caption))\n",
    "        plt.axis('off')\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "17d4ffbb",
   "metadata": {},
   "source": [
    "### 训练一个好的图片说明任务"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2077183f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 2500) loss: 77.557809\n",
      "(Iteration 51 / 2500) loss: 41.835524\n",
      "(Iteration 101 / 2500) loss: 35.659107\n",
      "(Iteration 151 / 2500) loss: 33.714988\n",
      "(Iteration 201 / 2500) loss: 30.808365\n",
      "(Iteration 251 / 2500) loss: 28.904012\n",
      "(Iteration 301 / 2500) loss: 26.059836\n",
      "(Iteration 351 / 2500) loss: 26.031326\n",
      "(Iteration 401 / 2500) loss: 22.815424\n",
      "(Iteration 451 / 2500) loss: 22.772759\n",
      "(Iteration 501 / 2500) loss: 20.736977\n",
      "(Iteration 551 / 2500) loss: 21.022939\n",
      "(Iteration 601 / 2500) loss: 19.118450\n",
      "(Iteration 651 / 2500) loss: 18.663928\n",
      "(Iteration 701 / 2500) loss: 16.895750\n",
      "(Iteration 751 / 2500) loss: 16.610176\n",
      "(Iteration 801 / 2500) loss: 16.800854\n",
      "(Iteration 851 / 2500) loss: 15.282215\n",
      "(Iteration 901 / 2500) loss: 13.853283\n",
      "(Iteration 951 / 2500) loss: 12.862395\n",
      "(Iteration 1001 / 2500) loss: 12.577979\n",
      "(Iteration 1051 / 2500) loss: 11.035210\n",
      "(Iteration 1101 / 2500) loss: 11.835750\n",
      "(Iteration 1151 / 2500) loss: 11.085219\n",
      "(Iteration 1201 / 2500) loss: 10.444645\n",
      "(Iteration 1251 / 2500) loss: 9.716379\n",
      "(Iteration 1301 / 2500) loss: 10.622007\n",
      "(Iteration 1351 / 2500) loss: 9.389702\n",
      "(Iteration 1401 / 2500) loss: 8.864774\n",
      "(Iteration 1451 / 2500) loss: 8.837836\n",
      "(Iteration 1501 / 2500) loss: 8.383492\n",
      "(Iteration 1551 / 2500) loss: 7.997636\n",
      "(Iteration 1601 / 2500) loss: 8.565062\n",
      "(Iteration 1651 / 2500) loss: 8.156050\n",
      "(Iteration 1701 / 2500) loss: 7.169216\n",
      "(Iteration 1751 / 2500) loss: 6.436919\n",
      "(Iteration 1801 / 2500) loss: 7.325675\n",
      "(Iteration 1851 / 2500) loss: 6.806780\n",
      "(Iteration 1901 / 2500) loss: 6.385995\n",
      "(Iteration 1951 / 2500) loss: 6.291843\n",
      "(Iteration 2001 / 2500) loss: 4.958617\n",
      "(Iteration 2051 / 2500) loss: 5.567452\n",
      "(Iteration 2101 / 2500) loss: 5.913960\n",
      "(Iteration 2151 / 2500) loss: 5.399012\n",
      "(Iteration 2201 / 2500) loss: 4.924958\n",
      "(Iteration 2251 / 2500) loss: 4.796707\n",
      "(Iteration 2301 / 2500) loss: 5.224964\n",
      "(Iteration 2351 / 2500) loss: 4.845715\n",
      "(Iteration 2401 / 2500) loss: 4.922645\n",
      "(Iteration 2451 / 2500) loss: 4.887911\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pass\n",
    "small_data2 = load_coco_data(max_train=5000)\n",
    "good_lstm_model = CaptioningRNN(\n",
    "                    cell_type='lstm',\n",
    "                    word_to_idx=data['word_to_idx'],\n",
    "                    input_dim=data['train_features'].shape[1],\n",
    "                    hidden_dim=200,\n",
    "                    wordvec_dim=256 )\n",
    "\n",
    "good_lstm_solver = CaptioningTrainer(good_lstm_model, small_data2,\n",
    "                     update_rule='adam',\n",
    "                     num_epochs=50,\n",
    "                     batch_size=100,\n",
    "                     updater_config={\n",
    "                         'learning_rate': 5e-3,\n",
    "                     },\n",
    "                     lr_decay=0.995,\n",
    "                     verbose=True, print_every=50,\n",
    "                 )\n",
    "\n",
    "good_lstm_solver.train()\n",
    "\n",
    "plt.plot(good_lstm_solver.loss_history)\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training loss history')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "0bbd8d5b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm9.staticflickr.com/8102/8510027814_acffff06cd_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHvCAYAAABQTQWGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAldUlEQVR4nO3de9x1ZV0n/s+XQEVB8JiiiCaOmTNKzfQzm0SbmEwnk195DAU0K9JicjzbQQS14/zMyfzhlIZ5NidPGWWjApWmUyamouUBATkoDzyckjxd88e1Niw2e9/3/QAPz8Pl+/167dd9773Wuta11t577c++1rXXVa21AACMbI9dXQEAgJ1N4AEAhifwAADDE3gAgOEJPADA8AQeAGB4Ag+wS1XViVX1K7u6HsDYynV4gOujqs5M8pTW2v/e1XUBWEcLD7DTVNWeu7oOAInAA1wPVfXaJHdL8q6quryqnl1Vrap+qqrOSvK+ab4/rqrzq+qSqjqtqu47K+OkqnrR9P9DquqcqnpGVX2pqs6rqiftko0DhiLwANdZa+2JSc5K8ojW2j5J3jJNenCS+yR56HT/5CT3SnLHJB9J8voNir1Tkv2S3CXJTyX5vaq6zQ1fe+BbicAD7AzHtdauaK19JUlaa69urV3WWvvXJMcluX9V7bdm2a8lOb619rXW2p8luTzJvW+UWgPDEniAneHsxT9V9W1V9etV9dmqujTJmdOk269Zdltr7euz+/+SZJ+dU03gW4XAA1xfq37qOX/sJ5M8Mslh6aeq7j49Xju3WgBXE3iA6+uCJN+xwfR9k/xrkm1JbpnkJTdGpQDmBB7g+vq1JL9cVduTPGrF9D9K8oUkX0zyySR/e+NVDaBz4UEAYHhaeACA4Qk8AMDwBB4AYHgCDwAwPIGHm4z5mEs3BYtxoTaYfmJV/cqNVJeTq+qo67H8KVX1lBuyTrtCVZ1ZVYfdAOXsstfiDbUN8K1G4LkJqqofqKoPTAMxXlRVf1NV31tVz58GcLy8qq6sqm/M7n9itvwpVXVxVd18qdyTquqr0/wXVdVfVtV3VtURs3K+UlXfnN2//MbfA2NorR3TWjsh2Twc3QDrelhr7TU7q3x2jp0drKaBXg/eWeXvalV19NJxcHE7YJp+ZlVdUFW3mi3zlKo6ZXa/VdUV03Lbquq9VfXYXbA5XE8Cz01EVX379PfWSf40ye8muW36AIsvTPKvrbWXtNb2mQZxPCbJBxf3W2v3nZa/e5IHpV8J98dWrOo3p+Xvkn7dlFe11l4/K/dhSc6dlbvPvH67o+q81teoqj13dR12tm+Fbbyx7a7vq6rau6r2nT00Pw4ubufOpu+Z5L9uUuz9p2PdvZOclOTlVfWC2Tp32+MfV9vtXqxcrar2r6qfq6oPp7/JkuTfJElr7Y2ttW+01r7SWntPa+1jWyz2yPQLv52UZO0pjmnQx7ckOWSL5Z5UVR+e6rv/FpdJVb2sqs6uqkur6u+r6kFbXO42VfWnVfXlqbXqT6vqrrPpp1TVi6vqb9LHYvqOqvrhqvr01DL2iqo6dX6apqqeXFVnTOX9RVUdtGbdr6mqZ0z/32X6BvjU6f7BU+tYzeZ/RlV9qarOq6onzR4/qapeNH27PDnJAfNvoFW1R1U9t/oYVNuq6i1VddvrsT+eMv1/dPVWwZdW1UVJjps99rvT/vlUVf3QmnXds6reN9Xpwqp6/fw5n741P7OqPjaV9eaqusVs+o9W1Ueranv1lsr7rX6Wr/p2fWxVfW5a128tPmS3WI/nVNXHklyxHHqqt15+vqoet1m9quq7q+ojVXVZVb05yS2yxvS8/XJVfWF63v+opoFSq+ru0zYdVVVnTfX+pTXl/EySI5I8e3pNvGs2+ZDru3+r6rTp39On8h+7xdfR8vuqVdVTq+qfp/1zwvTcfLD6+/otVXWzafnNyr9tVf1hVZ07TX/7uv28Ynu+r6pemeTcJP92q8sl+a0kz6wtHLdaaxe21l6b5OeSPK+qbjdNOq6qPllVz6qqO+3AurkxtdbcdqNbegj9z0nekOSSJG9LcniSvabpt06/RP9r0ltbbrOmnKOT/PWKxz+T5KlJ/n36qNTfPpt2UpIXTf/fKslrk5y+tPxDkpyzoty9pnq+bar3G6bt2GOT7X1Cktulf8t6RpLzk9xizbzz+t0uyU+kD1Wwb5I/TvL22bynJDkryX2nsu+Q5NIkP56rv9F9LclTpvkPn/bNfabpv5zkA2vq8eQk75r+/8kkn03y5tm0d8z21deTHD/tn4enf0jcZsX2XGu/JvnF9HB61yQ3T/LKJG9cU6et7I/Fth491esXpm3de/bY06e6PnZ6Hm+7YvmDp+f25tN+PS3J78zWdWaSDyc5IL0V8owkx0zTvifJl5I8IMm3pYfuM5PcfM12tSTvn8q5W5J/2sF6fDTJgUn2nj122FSPs5L86Gb1SnKz9CtFL/bNo9JfOy/a4PXxmfThNvZJ8idJXjtNu/u0Tb8/7ff7pw+7cZ/NXvM7cf8evIOvo/n7aq+pjHemH5vuO23Pe6ft3y/96tpHbbH8dyd5c5LbTGU/eJPjx52TPHvaB59N8oIk99jsOLi0Lw+bnqPFe/EpSU5Zt49mx7uvJ3nY7Lh9WPox85Ik70o/1uy1Uf3dbtzbLq+A2+zJSH5+Oph8JMmxSW6/Zr77TAfCc6Y33TszCy7TPNd6oyf5gfQD9e2n+59K8vTZ9JOSXJlke5JvJvl8kvstlfGQrAg8S/Pcfqr/R6bt+fkd2AcXpzcfr5p2UtZ/yByS5OLZ/VOSHD+7f2R60/bifqWP6L348Dw5yU/Npu+RHk4OWrGue077aI8kJyb52cU+SQ+i/222r76SZM/Zsl9K8n3L27Nqv6YfxH9odv/O0/O356p9sIX9MQ88Z614vZyb6err02MfTvLE5eVXrOvwJP8wu39mkifM7v9mkhOn////JCcsLf/prPlgS/+w+ZHZ/acmee8O1OPJS/OcmX4K+JwkPzh7fG29khy6Yt98IOtfi+9N8tTZ/XsvnrdcHXjuurSfH7fV1/xO2L8Hr5q2lffVrIz/OLv/90meM7v/3zMLouvKT399fzNrvsQtLXe39FP7Fyd59fQc1Yr5jk4/Rm6f3T67tC8PS28RuiQ9OG8aeKbHz09yxIrH900Pvaelv99P2Gx73G6cm1Nau5d7pH+z+WiSj6W35FxLa+2M1trRrbW7pr9RD0jyO1so/6gk72mtXTjdf0OufVrrt1tr+6cfmL+SfrDeUdvS6//R9O25x7oZq5/uOWNqmt+e/o3w9putoKpuWVWvnE4bXJp+cNm/qr5tNtvZs/8PmN9v/cg07yR8UJKXTacBtie5KD0U3WV53a21zya5PP1g/aD0A++5VXXv9A/IU2ezb2utfX12/1/Sv/VvxUFJ3jar0xlJvpHkWv0Ftrg/5s5e8dgXp/2y8IX0/ba8rjtW1Zuq6ovTul6Xaz9n58/+n2/zQUmesdimabsOXLWeNXW9qk5brMeq7TwmvfXu/bPHNqrXAVm9b9Y5YGn6F9LDzvx5W7d/tuqG3L9XuQ7vq4ULZv9/ZcX9RV+/jco/MMlFrbWLt1DVW6W3Jp2T5PQkZyw9P3N/21rbf3a75/IMrbWPp7+Pn7uFdaeq9koPRxetKOuyXH382yvX7RjKTiDw7EZaa89Ibwb+xyT/I8nnp/Ph99pgmU+lfwvc8Jx1Ve2d5DFJHlxV51fV+elN9PevqvuvKPes9NM+L5uW3VRV3auqTkhvGXrZtB3fMW3XqvkflOQ5U71uMwWtS9KDxmaekX4geUBr7dbp3/CytOz8AHhe+qmhxbprfj/9IP6zSwfGvVtrH1iz/lPTT23crLX2xen+kbk6sO6oVQfrs9ObzOd1usW0vmVb2R+bre8u035ZuFt6y8ayX5uWv9+0ridssJ5lZyd58dI23bK19sYNljlwTZ22Uo9V23lMkrtV1Uu3WK/zsnrfrHNuevCYz/v1XDMEbNW6D/F1rsv+ndvR99WO2qj8s5Pcdot9ac5IP1Yem356/p+r6p1V9aha+vXpDnhBkp/Oii85Kzwy/Tn98OKBqrpr9T53n0zypiQXJjmktfaY61gfbmACz26mtfbl1tpLW2v3Sz/XvX+SD1bVq5OrOlo+Y9HRr6oOTPL4bD4C9eHprQPfld4ycUj6qbG/Sv+gXlWXv0w/eP/MZvWe6vfBqb4/0Vq7/7QdX95gsX3TDxpfTrJnVf1qej+Ardg3/Zvj9uodeV+wyfzvTvLvqurw6p1Xn5Zk3rnwxPROiItfs+1XVY/eoLxT009BLjp+npLeJ+avW2vf2OI2zF2Q5HY1dW6d1enFNXWerqo7VNUj1yy/o/tjlTsmObaq9pq2/T5J/mzNui6f1nWXJM/agXX8fpJjquoB1d2qqv5LXfNXNcueNXV2PTA9hL/5etbjsiQ/kuTQqvr1LdTrg+mv02Oras+q+vEk/88G5b8xydOr6h5VtU+Sl6T38fr6Bsusc0H6B/tW7ej+XS7/hngdbWRt+a2189JPLb9ier73qqpD15ST1r2/tXZkeih+R/rr47zaoCP8BuV9Jv21dey6eap3qj4iye8l+Y3W2rbp8eOSfCI9zP1cknu11o5vrW3UEsiNTODZjbXW/r619gvpzdEnTg9flt4h8UNVdUV60Pl4+jenjRyV5A9ba2e11s5f3JK8PMkRtf5nu7+V/iuRzb41nZjkgNbaL7TW/n7zrUuS/EX6Ae6f0pv9r8zq5vJVfie90+eF6fvgzzeaeTqN9+j0/g7b0oPf36V3sExr7W1JfiPJm6am9o+ndwpf59T0g/ci8Px1ekfM09YusXH9PpX+Qfm56VTEAemtZO9M8p6quix9Ox+wpojfyQ7sjzU+lOReUxkvTvKoxQF9yQvTO8dekh4k/2SrK2it/V36t+iXp/e/+Ex6P4uNvCO9X8hHp/W96gaox/b0Ds8Pq6oTNqpXa+2r6R1Qj56mPXaTdb06vfPqaemtnVemh+Hr4lVJvmt6Tbx9s5mvw/49LslrpvIfkxvmdbSRzcp/Ynp/p0+l93/5xa0U2lq7rLX2qtbag9LD6Jdmkx9Y174Oz/euKer49NNly06vfs2xz6T38Xl6a+1XZ9Pfnn78e1Jr7dQNTq+xC5XnhW9F1X/afE56p8P3bzb/6Krq6PROyT+wq+syV1Ut/dvyZ3Z1XYCbNi08fMuoqodWv7bRzZM8P73fwGanAgEYgMDDt5IHpl+r48Ikj0hyeOsXWARgcE5pAQDD08IDAAxP4IGZmo05dVNXfSypw9ZM26mjcF+XOk3Tn19Vf7DFsi6vqh35yfZ1Ujt5JPvroqqOq6rX7ep6wE2JwHMTUVWPq6oPVdUV1Qck/FD1AfsOWvq5ZZvmWdzf0mCcK9b3yOoDEF5afYDD91Yf+PDEWdlfraqvze6fPC1b1Qd7/OSKck+pqiun+S+sqj+pqjtPH3SLcq6sqm/M7n/i+u4/bhpaay9prW0pcLY+6vXndnaddrVdFbhujPVOx6uDb4Byjl46Zlw1CO80/cyquqD6QL2LZZ5SVacs1WVx7Nw2HfMee33rxu5D4LkJqD4y98vSr4lzp/RL1B+T5D8mOX868O/TWltcXv7+s8f+agfW8+3T34OT/FH6tX32Sx8a4hVJvtlaO2a2rsUF1RbrWly35tD0i9h9x5rrXfz8tPzB6Zec/+3pg25R7jHp414tyl1cDPBaQyrsLja4jtFNovzdwbfCNo5mVz5nVbV3XfOCivNjxuI2v1L4YtDgjdx/OgbdO/0K9i+vqqsujrg7H4PYnMCzm6t+5d3j0wcjfOt0ga3WWvuH1toRrbV/vZ7l36mqnjW1xhw3PXxIks+31t47reuy1tr/an24ia04Kv1icX+Wa4/VdZXp4m9vn9a3Fe+vqvdV1ROq6pZbXCZV9cfVh9O4pKpOq+lqyltY7p7T+rZNrVGvr9ll76dvjc+pqo8luaL6VXiPrD5O0Laq+pX5KZyq2qP6pec/O01/S/Wrza5a90Oq6pyp/POT/OFmy1fVE2fr/qUtbOLtq+ovq+qyqjq1rr6i892nb7tXfZjV7FRfVR08zX/JtF/evG4FG9Wp+mmZt1bV66pf7PHomp2qqao/r6qfX1rm9OpXOr5G60D1U3S/V1XvnrbnQ1V1z9lyP1xVn57q/Iqp/itbkqYP0pOq6uLpffG9S9PvM+2P7VX1iar6senxe0yP7THd/4Oq+tJsuddV1S/O9ucJVfU3U33fU1XXGkOueovEyUkOqKVWiyQ3q6o/mpb/RFX9h9lyB1TV/6qqL1fV56tqo6sHP7yqPjmV88Wqeua69a55zvarqldV1XnT8i+q2dhbVfXk6uPlXVxVfzF7nS0u0nn6VP6WWlOq6vuq6pXpV4HfcEidJb+V5Jm1taErLmytvTb9qsnPq6rbTZOOm/bVs6rqThsUwW5I4Nn9PTDJzdMDxA6rqj+tqucuPbZXVf14Vb0rfSTl+6VfTv1p0ywfSfKdVfXSqvrB6pfH3+r6bpk+xtTrp9vjqupma+a9XfoVbLd6Ubn/kH4V26OSfLGq/mdVPXALy52cfgXhO6Zv2+u3uL5KH6/pgPRhFg7M1aFw4fFJ/kv6kBr/Jr0l7Ij0kZ/3yzXH5Tk2fYiPB09lXpx+ifp17pTktunjMv3MRstX1Xelj5T9xGna7XLNscJWOSLJCekDbn40W98vJyR5T/q4YXdN8rurZtpinR6Z5K3p+295/W9I37/z8g5Kv6ryKo9Pv/rybdJfUy+elrv9tI7nTXX4dJLv32D7XpDkntPtoZmF9uqDRr4rffvvmH4F5ddX1b1ba59PcmmS755mf1CSy6vqPtP9Q3PNgWV/MsmTpnJuluSZyxVprV2RfsXvc1e0WvxY+phN+6dfkfvlUx33mOp4evrr74eS/GJVPXTN9r4qfRy5fdMDxPs2We/yc/aa9KE3Dp62/YfTr0acqjo8/ZpXP54+2OZfpV9RPK21xbARixbpjYLznavq2VV1xrTOc5N8T2vtg+uWWeHv0oeAudZ+3sA70luGFkOJPC39fXi/JJ+uqndNx9K9dqBMdpW2GwzZ7rb+lj4g4vlLj30gyfb0MWkOXZrWkhy8QXknpF92/bQkT06y75r5vi/JW9LHuboyvXl3n6V5jkvyuhX1/XL6QeLmUz3/39n0U9JHd75kqutHk9xtqYyj08ek2mi/HJh+IP10+mXoH7PF/bn/tN791kw/Jf2Kw6umHZ7kH2b3z0zy5Nn9X03yxtn9Wyb5apLDpvtnJPmh2fQ7p19Gf88V63rItOwtZo+tXX5a95tm0241X/eK8k9amn+f9LHWDkxy92kf7TmbftV+ST/d+T+T3HWTfb1hnabXz2nrXlPpQ3dckeSg6f6Lk7x61Wt92p4/mE17eJJPTf8fmX66YzFtMVDluuf5c0l+ZHb/Z5KcM/3/oPSRyveYTX9jkuOm/1+b5L+lh9VPpw9lckz6aeHti+Wm/fnLszKemuTP19TnIYv1L+2n/z27/11JvjL9/4AkZy3N/7z0oWVWlX9Wkp9Ncustrve02f1vTx+eZe/ZY49P8v7p/5OT/NRs2h7p7//Fc7rZ8epu6aOYX5z+ZefQTJdTWZrv6PTQtX12++zSe/Ww9EB3SXr4ekqSU1a9npbKPj/9iuzLj++bfgw9Lf2YesJG7we3XX/TwrP725Z+6uGq0wutte9vfWTxbdnxVrp7J9krPWh8rLV22aqZWmt/21p7TGvtDukH+UOTbOU0yVFJ3tJa+3rrp9v+JNc+rXVsa22/9G9Ji1aCHXVe+jfYxbfYlWVU1bdV1a9XPw10afqBL+mtGhuqqjtW1ZumZvpLk7xuxXLzsb8OmN9vrf1L+nO0cFCSt02nPbanB5hvpH9orPLl1tqVW1x+ed1XLK17lfn8lye5aCpnM89ODw0fnk6lPHnNfFup09qx06bX5ruTPG566HHZuBXq/Nn//5Ie4lbVo6UPK7LONeZPH+ftGtNaa99cmr5oyTs1PSgcmv5BeEp6i9yDk/zV0nLr6rtVy8vfYjpOHJR+Kmr77LXy/Kx/nf1EekD8wnSqb7NW0/m+OSj9eHLebF2vTG+1Wkx/2WzaRemvna2MSJ70kHzf9Ofr9CRnTM/fKn/brjlK/D2XZ2itfTw9QD332otf29Ryc4ep3stlXZbkY+nH0r3Sj63sxgSe3d8H079BrRsle4e01h6T3mfmwiRvnj6wnlvT6Otrlvk/6cFlw/PlUxn/KckTqveZOT/99NbDV/VPaK39Y5IXJfm9qqqt1L+qvruqXpp+APylJH+Z5C6ttf9vzSI/mb7vDks/xXT3RVFbWN2vpX/ru19r7dbprVfLy80PvudlFryqau/0UygLZyd52NJB+RattS+uWf/ygX2j5c9Lb51ZrPuWS+teZT7/Pumnz85Nb1VJegvVwlX9FVofePanW2sHpLcMvKJW/9JmK3Xa7Mqnb0zy+OlDeO8k12Xcs+XnpbJxyL5GvdNbGRbOTXLgdNpoPn3xHJ6a/gXhIdP/f53+44IH55qns3bEjl4d9uz0Pnjz18m+rbWHryy8tf/TWntkekh5e3rL7kbrnT9+dvrx6fazdd26TT80mKb/7FJd9m6tfWArG9JaOyN9NPdjk/z7JP9cVe+sqkfV5gMar/OC9AFWtxK6HpnecvThxQNVddfpmPnJ9FOKFyY5ZDq2shsTeHZzrXfsfWH6h8qjqmqf6p1XD8nqUX23UuYXWmvHp59zf2r6N5NPVNVxSVJVP1BVP11Vd5zuf2d6f4HNxp16YvrI5/dOD1WHpPdrOSezvhhLXpN+oP2xzepdVe9L75twZfqpvO9vrf1+a+3SDRbbN/2AvC39A/wlm61nadnLk2yvqrskedYm8781ySOq6vunfksvzDUD0olJXjzrtHmHqtqRILvR8m9N8qPTc3ez9I7um72/Hz6b/4QkH2qtnd1a+3L6B/gTphayJ6f3Z8m03kfPAvLF6R+A31hR/nWp07I/S28lOD79F4Hf3GT+Vd6d5N9V1eFTC8jTMgtwK7wlvaPqbabtnI90/qH0QPjsqS/cQ9KHKXlTkrTW/jn9VPMT0k/9XJrkgvRWlOsaeC5IcrvqP2DYig8nubR6h/e9p+fw39aKX0xW1c2q6oiq2q+19rX0PkiL53LT9bbWzkvvz/Tfq+rW07HpnlX14GmWE9P35eKXlvtV1aOXtm3Daym17v2ttSPTg+g70n9tdV5V3W8L+2O5vM8keXN6iFqpqm5bVUek95H7jdbatunx45J8Iv0Y93PpA9se31r7wrqy2H0IPDcBrbXfTO8X8Oz0c8UXpDcbPye9P89aVXVyVT1/TbmttXZqa+1J6U31b58mbU8PIP9YVZcn+fMkb0vvj7CRo5K8YmoBuOqWftBb+Wut1tpXk/yPJL+ySdlJb9G5W2vtea21f9rC/Envb/KF9A/wT2bHBgt9YZLvST/n/+70Vq61WmufSP9wfFN6K8Fl6c/X4pd0L0vvXPqeqrpsqssDdqA+a5ef1v209I6+56UHkc2uofKG9G+7F6V/ez5iNu2n0wPetvRTCvPX2fcm+dD02nhnkv/aeofda7iOdVouY3Fa9LCpnB3WWrswyaPTX7/b0vu7/F2ufl6WvTD9NfP59A/z187K+mr6e+Nh6d/sX5HkyNbap2bLn5pkW7v6V42npgfff7iO9f9UekvX56ZTQxuedmytfSM9hB0ybcOFSf4gvYVzlScmOXM6bXtMeljbkfUemd7p+pPpz/Fb0/uXpbX2tiS/keRNU/kfT993C8clec1U/qYtJK3/YvRVrbUHpXck/tJs8gPr2tfhWXVZjKQH6FVfGE+fXtefSe/j8/TW2q/Opr89yQGttSdNx84dbX1jFzKWFuwk02mi7enfAq8VCNg1ptNR56R3RL0up8iAmyAtPHADqqpHVNUtq1/H5LeT/GOu7ijNLlJVD62q/ad+H89Pb3HZkdY+4CZO4IEb1iPTO7aem37tn8dp9t4tPDDJZ9NP7zwiyeGtta/s2ioBNyantACA4WnhAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDwBB4AYHgCDwAwPIEHABiewAMADE/gAQCGJ/AAAMMTeACA4Qk8AMDw/i+i+sxRR2PODgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm8.staticflickr.com/7035/6510880243_4086cbb06e_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0BB4AYHoCDwAwPYEHAJiewAMATE/gAQCmJ/AAANMTeACA6Qk8AMD0/n9Qh6sgDSKyTAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm6.staticflickr.com/5328/9362192917_5324bd3d74_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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E3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADTE3gAgOkJPADA9AQeAGB6Ag8AMD2BBwCYnsADAExP4AEApifwAADT+/8BStCKDfy2Q+gAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "http://farm4.staticflickr.com/3316/5816070088_dfdce60093_z.jpg\n"
     ]
    },
    {
     "data": {
      "image/png": "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gPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMoj8AAAgPIIPAAAoDwCDwAAKI/AAwAAyiPwAACA8gg8AACgPAIPAAAoj8ADAADKI/AAAIDyCDwAAKA8Ag8AACiPwAMAAMr7/7ArMM5m9DjJAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#pass\n",
    "for split in ['train', 'val']:\n",
    "    minibatch = sample_coco_minibatch(small_data2, split=split, batch_size=2)\n",
    "    gt_captions, features, urls = minibatch\n",
    "    gt_captions = decode_captions(gt_captions, data['idx_to_word'])\n",
    "\n",
    "    sample_captions = good_lstm_model.sample(features)\n",
    "    sample_captions = decode_captions(sample_captions, data['idx_to_word'])\n",
    "\n",
    "    for gt_caption, sample_caption, url in zip(gt_captions, sample_captions, urls):\n",
    "        #plt.imshow(image_from_url(url))\n",
    "        print(url)\n",
    "        plt.title('%s\\n%s\\nGT:%s' %(split, sample_caption, gt_caption))\n",
    "        plt.axis('off')\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f9a5ed25",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
